home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / atari / aoutdump.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  4KB  |  231 lines

  1. /* @(#)aoutdump.c    1.1 */
  2. #define    ushort    unsigned short
  3.  
  4. #include <stdio.h>
  5. #include "out.h"
  6.  
  7. struct outhead    outhead;
  8. struct outsect    outsect[S_MAX - S_MIN + 1];
  9. struct outrelo    outrelo;
  10. struct outname    outname;
  11.  
  12. char        options[] = "111111";
  13. char        *progname;
  14.  
  15. main(argc,argv)
  16. int argc;
  17. char *argv[];
  18. {
  19.     register char *filename = "a.out";
  20.  
  21.     progname = argv[0];
  22.     if (argc > 3)
  23.         error('f',"Usage: %s [filename [111111]]", progname);
  24.     if (argc > 1)
  25.         filename = argv[1];
  26.     if (freopen(filename, "r", stdin) == NULL)
  27.         error('f',"Couldn't open %s for input",filename);
  28.     if (argc > 2) 
  29.         strncpy(options,argv[2],6);
  30.     p_head(0);
  31.     p_sect(1);
  32.     p_fill(2);
  33.     p_relo(3);
  34.     p_name(4);
  35.     p_char(5);
  36. }
  37.  
  38. p_head(part)
  39. {
  40.     getofmt((char *)&outhead, SF_HEAD, stdin);
  41.     if (options[part] != '1')
  42.         return;
  43.     printf("header:");
  44.     printf("\toh_magic: 0x%04x\n", outhead.oh_magic);
  45.     printf("\toh_stamp: %d\n", outhead.oh_stamp);
  46.     printf("\toh_flags: 0x%04x\n", outhead.oh_flags);
  47.     printf("\toh_nsect: %d\n", outhead.oh_nsect);
  48.     printf("\toh_nrelo: %d\n", outhead.oh_nrelo);
  49.     printf("\toh_nname: %d\n", outhead.oh_nname);
  50.     printf("\toh_nemit: %ld\n", outhead.oh_nemit);
  51.     printf("\toh_nchar: %ld\n", outhead.oh_nchar);
  52. }
  53.  
  54. p_sect(part)
  55. {
  56.     register struct outsect *sp;
  57.     register i = 0;
  58.  
  59.     for (sp = outsect; sp < &outsect[outhead.oh_nsect]; sp++,i++) {
  60.         getofmt((char *)sp, SF_SECT, stdin);
  61.         if (options[part] != '1')
  62.             continue;
  63.         printf("\nsection %d header:\n", i);
  64.         printf("\tos_base: 0x%lx\n", sp->os_base);
  65.         printf("\tos_size: %ld\n", sp->os_size);
  66.         printf("\tos_foff: %ld\n", sp->os_foff);
  67.         printf("\tos_flen: %ld\n", sp->os_flen);
  68.         printf("\tos_lign: %ld\n", sp->os_lign);
  69.     }
  70. }
  71.  
  72. p_fill(part)
  73. {
  74.     register struct outsect *sp;
  75.     register i = 0;
  76.     register c;
  77.     register long l;
  78.  
  79.     for (sp = outsect; sp < &outsect[outhead.oh_nsect]; sp++,i++) {
  80.         if (ftell(stdin) != sp->os_foff)
  81.             error(
  82.                 'f',
  83.                 "sp->os_foff (%ld) != ftell() (%ld)",
  84.                 sp->os_foff,
  85.                 ftell(stdin)
  86.             );
  87.         if (options[part] != '1') {
  88.             fseek(stdin, sp->os_flen, 1);
  89.             continue;
  90.         }
  91.         printf("\nsection %d filler:\n", i);
  92.         for (l = 0; l < sp->os_flen; l++) {
  93.             if ((l & 15) == 0)
  94.                 printf("%06lx: ", l);
  95.             if ((c = getc(stdin)) == EOF)
  96.                 error('f', "EOF");
  97.             printf(" %02x", c & 0xFF);
  98.             if ((l & 15) == 15)
  99.                 printf("\n");
  100.         }
  101.         if ((l & 15) != 0)
  102.             printf("\n");
  103.     }
  104. }
  105.  
  106. p_relo(part)
  107. {
  108.     register i = 0;
  109.  
  110.     if (options[part] == '1')
  111.         printf("\nrelocation:\n");
  112.     for (i = 0; i < outhead.oh_nrelo; i++) {
  113.         getofmt((char *)&outrelo, SF_RELO, stdin);
  114.         if (options[part] != '1')
  115.             continue;
  116.         printf("%4d: t=%02x s=%02x i=%-5d a=%06lx\n",
  117.             i,
  118.             outrelo.or_type,
  119.             outrelo.or_sect,
  120.             outrelo.or_nami,
  121.             outrelo.or_addr
  122.         );
  123.     }
  124. }
  125.  
  126. p_name(part)
  127. {
  128.     register i = 0;
  129.  
  130.     if (options[part] == '1')
  131.         printf("\nsymbols:\n");
  132.     for (i = 0; i < outhead.oh_nname; i++) {
  133.         getofmt((char *)&outname, SF_NAME, stdin);
  134.         if (options[part] != '1')
  135.             continue;
  136.         printf("%4d: o=%-6ld t=%04x d=%04x v=%ld\n",
  137.             i,
  138.             outname.on_foff,
  139.             outname.on_type,
  140.             outname.on_desc,
  141.             outname.on_valu
  142.         );
  143.     }
  144. }
  145.  
  146. p_char(part)
  147. {
  148.     register long off;
  149.     register i = 0;
  150.     register c = 0;
  151.  
  152.     off = ftell(stdin);
  153.     if (off != OFF_CHAR(outhead))
  154.         error(
  155.             'f',
  156.             "char off (%ld) != ftell() (%ld)",
  157.             OFF_CHAR(outhead),
  158.             off
  159.         );
  160.     if (options[part] != '1')
  161.         return;
  162.     printf("\nstrings:\n");
  163.     for (i = 0; i < outhead.oh_nchar; i++,off++) {
  164.         if (c == 0)
  165.             printf("%ld:\t", off);
  166.         c = getc(stdin);
  167.         if (c == EOF)
  168.             error('f', "EOF");
  169.         if (c >= ' ' && c < 0177)
  170.             putchar(c);
  171.         else if (c == 0)
  172.             putchar('\n');
  173.         else
  174.             printf("\\%03o", c);
  175.     }
  176. }
  177.  
  178. /* VARARGS2 */
  179. error(t,s,a,b,c,d,e,f,g,h,i,j)
  180. char t;
  181. char *s;
  182. {
  183.     fprintf(stderr,"%s: ",progname);
  184.     fprintf(stderr,s,a,b,c,d,e,f,g,h,i,j);
  185.     fprintf(stderr,"\n");
  186.     switch (t) {
  187.     case 'w':
  188.         return;
  189.     case 'f':
  190.         exit(1);
  191.     case 'a':
  192.         abort();
  193.     default:
  194.         error('w',"Illegal error type: '%c'",t);
  195.     }
  196. }
  197.  
  198. getofmt(p, s, f)
  199. register char    *p;
  200. register char    *s;
  201. register FILE    *f;
  202. {
  203.     register i;
  204.     register long l;
  205.  
  206.     while (i = *s++) {
  207.         switch (i) {
  208. /*        case '0': p++; break; */
  209.         case '1':
  210.             *p++ = getc(f);
  211.             break;
  212.         case '2':
  213.             i = getc(f);
  214.             i |= (getc(f) << 8);
  215.             *((short *)p) = i; p += sizeof(short);
  216.             break;
  217.         case '4':
  218.             l = (long)getc(f);
  219.             l |= (long)(getc(f) << 8);
  220.             l |= ((long)getc(f) << 16);
  221.             l |= ((long)getc(f) << 24);
  222.             *((long *)p) = l; p += sizeof(long);
  223.             break;
  224.         default:
  225.             error('f', "bad getofmt string");
  226.         }
  227.     }
  228.     if (feof(f) || ferror(f))
  229.         error('f', "read error");
  230. }
  231.